package com.lap.framework.tools;

import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;

/**
 * 名称工具,提供 点转目录,文件名转换
 *
 * @author Shuisheng Lao(劳水生)
 * @version 0.0.1
 */
public final class Named {
  private static final String EMPTY = "";
  private static final String BACKSLASHES = "/";
  private static final String PERIODS = ".";

  private Named() {}

  /**
   * 点转换到反斜杠,注意这里都是包括后缀结束的。
   *
   * <p>(periodsPath=com.lap.permission) -> com/lap/permission/
   *
   * @param periodsPath 点号路径
   * @return 文件路径
   */
  public static String periods2Path(String periodsPath) {
    if (StringUtils.isBlank(periodsPath)) return EMPTY;

    String newPath = periodsPath.replace(PERIODS, BACKSLASHES);
    return newPath.endsWith(BACKSLASHES) ? newPath : (newPath + BACKSLASHES);
  }

  /**
   * 默认 “_” 转换到大写开头驼峰名字
   *
   * <p>(name=test_person) -> TestPerson
   *
   * @param name 文件名
   * @return 大写驼峰名字
   */
  public static String upperHump(String name) {
    return upperHump(name, "_");
  }

  /**
   * 转换到大写开头的驼峰名字
   *
   * <p>(name=test-person,separator=-) -> TestPerson
   *
   * @param name 文件名
   * @param separator 分隔符
   * @return 大写开头驼峰名字
   */
  public static String upperHump(String name, String separator) {
    if (StringUtils.isBlank(name)) return EMPTY;

    String[] array = StringUtils.split(name, separator);
    return Stream.of(array)
        .filter(StringUtils::isNotBlank) // filter
        .map(item -> item.substring(0, 1).toUpperCase() + item.substring(1)) // map
        .collect(Collectors.joining());
  }

  /**
   * 默认 “_” 转换到小写开头驼峰名字
   *
   * <p>(name=test_person) -> testPerson
   *
   * @param name 文件名
   * @return 小写开头驼峰名字
   */
  public static String lowerHump(String name) {
    return lowerHump(name, "_");
  }

  /**
   * 转换到小写开头驼峰名字
   *
   * <p>(name=test-person,separator=-) -> testPerson
   *
   * @param name 文件名
   * @param separator 分隔符
   * @return 小写开头驼峰名字
   */
  public static String lowerHump(String name, String separator) {
    if (StringUtils.isBlank(name)) return EMPTY;

    String result = upperHump(name, separator);
    return result.substring(0, 1).toLowerCase() + result.substring(1);
  }

  /**
   * 获取文件名称，包含扩展名字
   *
   * @param fileName 文件名
   * @param extension 文件扩展名
   * @return 文件名称
   */
  public static String fileName(String fileName, String extension) {
    return (StringUtils.isBlank(fileName)) ? EMPTY : fileName + extension;
  }

  /**
   * 下划线转换到 行线 名字
   *
   * @param fileName 文件名称
   * @return 名称
   */
  public static String mappingUri(String fileName) {
    if (fileName == null || fileName.isEmpty()) {
      return EMPTY;
    }
    // 使用正则替换并处理末尾的 "s" 添加
    return fileName.replaceAll("_", "-").concat(fileName.endsWith("s") ? "" : "s");
  }
}
